// 定义页面
Page({
  // 页面的初始数据
  data: {
    classList: [], // 班级列表
    currentClass: null, // 当前选中的班级ID
    studentList: [], // 学生列表
    logList: [], // 谈心谈话记录列表
    showAddModal: false, // 是否显示添加记录的模态框
    // 表单数据，用于添加新的谈心谈话记录
    formData: {
      studentId: '', // 学生ID
      content: '', // 谈话内容
      conclusion: '', // 谈话结论
      talkType: '日常交流', // 谈话类型，默认为日常交流
      followUpRequired: false, // 是否需要跟进
      followUpDate: '', // 计划跟进日期
      attachments: [] // 附件列表
    },
    currentStudent: null, // 当前选中的学生对象
    // 预设的谈话类型选项
    talkTypes: ['日常交流', '心理异常跟进', '学业问题', '行为偏差', '人际关系', '其他']
  },

  // 页面加载时的生命周期函数
  onLoad(options) {
    // 判断是否通过options传递了studentId，如果是，则加载特定学生的信息
    if (options && options.studentId) {
      this.loadSpecificStudent(options.studentId);
    } else {
      // 否则，加载班级列表
      this.loadClassList();
    }
  },

  // 异步加载特定学生的信息和其谈心记录
  async loadSpecificStudent(studentId) {
    try {
      // 获取数据库引用
      const db = wx.cloud.database();
      // 根据学生ID查询学生信息
      const { data: student } = await db.collection('users').doc(studentId).get();
      // 如果学生存在
      if (student) {
        // 根据学生的班级ID查询班级信息
        const { data: classInfo } = await db.collection('classes').doc(student.class).get();
        
        // 更新页面数据，设置当前班级、当前学生和班级列表（只包含当前班级）
        this.setData({
          currentClass: student.class,
          currentStudent: student,
          classList: classInfo ? [classInfo] : [] // 如果班级信息存在则设置，否则为空数组
        });
        
        // 加载该学生的谈心谈话记录
        this.loadCounselingLogs(studentId);
      }
    } catch (error) {
      // 捕获并处理错误，显示提示信息
      wx.showToast({
        title: '加载学生信息失败',
        icon: 'none'
      });
    }
  },

  // 异步加载班级列表
  async loadClassList() {
    try {
      // 获取数据库引用
      const db = wx.cloud.database();
      // 查询所有班级信息
      const { data } = await db.collection('classes').get();
      // 更新页面数据，设置班级列表
      this.setData({
        classList: data
      });
    } catch (error) {
      // 捕获并处理错误，显示提示信息
      wx.showToast({
        title: '加载班级列表失败',
        icon: 'none'
      });
    }
  },

  // 当班级被选中时的事件处理函数
  async onClassSelect(e) {
    // 从事件对象中获取班级ID
    const classId = e.currentTarget.dataset.id;
    // 更新页面数据，设置当前选中的班级ID
    this.setData({
      currentClass: classId
    });
    // 异步加载该班级的学生列表
    await this.loadStudentList(classId);
  },

  // 异步根据班级ID加载学生列表
  async loadStudentList(classId) {
    try {
      // 获取数据库引用
      const db = wx.cloud.database();
      // 查询指定班级ID且角色为 'student' 的用户（即学生）
      const { data } = await db.collection('users')
        .where({
          class: classId, // 班级ID匹配
          role: 'student' // 角色为学生
        })
        .get();
      // 更新页面数据，设置学生列表
      this.setData({
        studentList: data
      });
    } catch (error) {
      // 捕获并处理错误，显示提示信息
      wx.showToast({
        title: '加载学生列表失败',
        icon: 'none'
      });
    }
  },

  // 当学生被选中时的事件处理函数
  async onStudentSelect(e) {
    // 从事件对象中获取学生ID
    const studentId = e.currentTarget.dataset.id;
    // 从当前学生列表中查找选中的学生对象
    const student = this.data.studentList.find(s => s._id === studentId);
    // 更新页面数据，设置当前选中的学生对象
    this.setData({
      currentStudent: student
    });
    // 异步加载该学生的谈心谈话记录
    await this.loadCounselingLogs(studentId);
  },

  // 异步根据学生ID加载谈心谈话记录
  async loadCounselingLogs(studentId) {
    try {
      // 获取数据库引用
      const db = wx.cloud.database();
      // 查询指定学生ID的谈心谈话记录，并按创建时间降序排列
      const { data } = await db.collection('intervention_records')
        .where({
          userId: studentId // 学生ID匹配
        })
        .orderBy('createTime', 'desc') // 按创建时间降序
        .get();
      // 更新页面数据，设置谈心谈话记录列表
      this.setData({
        logList: data
      });
    } catch (error) {
      // 捕获并处理错误，显示提示信息
      wx.showToast({
        title: '加载谈心谈话记录失败',
        icon: 'none'
      });
    }
  },

  // 显示添加谈心谈话记录的模态框
  showAddLogModal() {
    // 检查是否已选择学生
    if (!this.data.currentStudent) {
      wx.showToast({
        title: '请先选择学生',
        icon: 'none'
      });
      return; // 未选择学生则不继续执行
    }
    // 设置显示模态框，并初始化表单数据
    this.setData({
      showAddModal: true,
      // 重置表单数据，将学生ID设置为当前选中学生的ID
      formData: {
        studentId: this.data.currentStudent._id,
        content: '',
        conclusion: '',
        talkType: '日常交流',
        followUpRequired: false,
        followUpDate: '',
        attachments: []
      }
    });
  },

  // 异步添加谈心谈话记录
  async addCounselingLog() {
    // 校验谈话内容是否为空
    if (!this.data.formData.content.trim()) {
      wx.showToast({
        title: '请输入谈话内容',
        icon: 'none'
      });
      return; // 内容为空则不继续执行
    }
    
    try {
      // 获取数据库引用
      const db = wx.cloud.database();
      // 向 'intervention_records' 集合添加一条新记录
      await db.collection('intervention_records').add({
        data: {
          ...this.data.formData, // 展开表单数据
          operatorId: wx.getStorageSync('userId'), // 操作者ID，从本地缓存获取
          operatorRole: 'counselor', // 操作者角色
          interactionType: 'talk', // 互动类型为谈话
          status: 'pending', // 初始状态为待跟进
          createTime: db.serverDate(), // 创建时间使用服务器时间
          updateTime: db.serverDate() // 更新时间使用服务器时间
        }
      });
      // 显示成功提示
      wx.showToast({
        title: '添加成功',
        icon: 'success'
      });
      // 关闭模态框
      this.setData({ showAddModal: false });
      // 重新加载当前学生的谈心谈话记录，以显示新添加的记录
      this.loadCounselingLogs(this.data.currentStudent._id);
    } catch (error) {
      // 捕获并处理错误，显示提示信息
      wx.showToast({
        title: '添加失败',
        icon: 'none'
      });
    }
  },

  // 异步上传附件
  async uploadAttachment() {
    try {
      // 调用微信选择文件API
      const res = await wx.chooseMessageFile({
        count: 1, // 最多选择1个文件
        type: 'file', // 文件类型为普通文件
        extension: ['doc', 'docx', 'pdf'] // 允许的文件扩展名
      });
      
      // 获取选择的临时文件路径
      const filePath = res.tempFiles[0].path;
      // 构建云存储路径，使用时间戳和文件名确保唯一性
      const cloudPath = `counseling_logs/${Date.now()}-${res.tempFiles[0].name}`;
      
      // 调用微信云存储上传文件API
      const uploadRes = await wx.cloud.uploadFile({
        cloudPath, // 云存储路径
        filePath // 本地临时文件路径
      });

      // 将上传成功后的文件ID添加到表单数据的附件列表中
      const attachments = [...this.data.formData.attachments, uploadRes.fileID];
      // 更新页面数据中的附件列表
      this.setData({
        'formData.attachments': attachments
      });
    } catch (error) {
      // 捕获并处理错误，显示提示信息
      if (error.errMsg !== "chooseMessageFile:fail cancel") { // 用户取消选择时不提示
        wx.showToast({
          title: '上传失败',
          icon: 'none'
        });
      }
    }
  },

  // 删除已上传的附件
  deleteAttachment(e) {
    // 从事件对象中获取附件在列表中的索引
    const index = e.currentTarget.dataset.index;
    // 复制当前的附件列表
    const attachments = [...this.data.formData.attachments];
    // 从复制的列表中移除指定索引的附件
    attachments.splice(index, 1);
    // 更新页面数据中的附件列表
    this.setData({
      'formData.attachments': attachments
    });
  },

  // 表单输入时的通用处理函数
  onInput(e) {
    // 从事件对象中获取字段名
    const { field } = e.currentTarget.dataset;
    // 更新页面数据中对应表单字段的值
    this.setData({
      [`formData.${field}`]: e.detail.value // 使用计算属性名动态设置字段
    });
  },

  // 谈话类型选择器改变时的处理函数
  onTalkTypeChange(e) {
    // 更新页面数据中表单的谈话类型字段
    this.setData({
      'formData.talkType': this.data.talkTypes[e.detail.value] // 根据选择的索引获取实际类型值
    });
  },

  // "是否需要跟进"开关状态改变时的处理函数
  onFollowUpChange(e) {
    // 更新页面数据中表单的是否需要跟进字段
    this.setData({
      'formData.followUpRequired': e.detail.value
    });
  },

  // 计划跟进日期选择器改变时的处理函数
  onFollowUpDateChange(e) {
    // 更新页面数据中表单的计划跟进日期字段
    this.setData({
      'formData.followUpDate': e.detail.value
    });
  },

  // 隐藏添加谈心谈话记录的模态框
  hideAddModal() {
    this.setData({
      showAddModal: false
    });
  },

  // 搜索谈话记录（此函数体内容在截断中未显示，将根据实际情况补充）
  searchLogs(e) {
    // 获取搜索关键词
    const keyword = e.detail.value.trim();
    // 如果关键词为空，则重新加载所有记录
    if (!keyword) {
      this.loadCounselingLogs(this.data.currentStudent._id);
      return;
    }
    // 过滤日志列表
    const filteredLogs = this.data.logList.filter(log => {
      // 检查谈话内容或结论是否包含关键词
      return (log.content && log.content.includes(keyword)) || 
             (log.conclusion && log.conclusion.includes(keyword));
    });
    // 更新日志列表为过滤后的结果
    this.setData({
      logList: filteredLogs
    });
  }
  // 可以在此添加更多页面方法，例如编辑、删除记录等
}) 